iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
Software Development

掌握Java神器,駕馭SpringBoot猛獸系列 第 4

第四天 來看Java怎麼使用記憶體

  • 分享至 

  • xImage
  •  

在現實生活中成立跟不成立是簡單的單詞,就能陳述的一件事,但是今天換到電腦的世界裡,要檢測一個條件成不成立必須思考許多面向,今天第四天要來透過Java的條件判斷和Null值,來說明實際操作記憶體的方式

開場先用簡單的String比對字串來做說明

String str1 = "abc";
System.out.printf("str1 equal abc ? %b\n", str1 == "abc");
// output: str1 equal abc true

String str2 = new String("abc");
System.out.printf("str1 equal str2 ? %b\n", str1 == str2);
// output: str1 equal str2 ? false

這段程式碼使用了兩個變數 str1與str2,套用的值分別是由雙引號建立的 abc,以及String物件建構的實例,在來分析打印的結果可以發現,直接使用雙引號字串比對值是,會是 true但是將str1與 str2的String實例進行比較則顯示false,想當初初學Java時看到這個結果,可能會認為雙引號定義字串值,行為等同建構一個String實例

但從這個結果可以看出來並不是我所想像的那樣,要了解上述程式範例實際運行方式,必須先知道下列兩個基礎知識

  1. 使用雙引號建立的字串,會將字串實際值存放在字串池(String Pool)
  2. 物件被建構時會在名為Heap的箱子中,切割一片區域作為實際物件使用的記憶體空間,使用此實例的資料,實際上就是取得記憶體位址,來進行操作

現在來完整的解釋程式碼的執行方式,最開始 str1是取得雙引號 abc的值,實際上是賦予"abc"在String Pool的紀錄的位址,下方重複出現 "abc",Java會從字串池檢查是否「已經存在相同字串」,存在就取得當前值的記憶體位置,因此當 str1 == "abc" 是拿"abc" 的記憶體位置進行比對

在往下看建構一個 String("abc")實例,並將其記憶體位址賦值給 str2,接著將 str1與str2進行比對,實際比較操作是先從字串池中取得 "abc"的記憶體位置,在從 Heap中找到 str2 的記憶體區塊進行比對,兩個值的「記憶體位置不相等」才會打印出 false

讓String.equals比對記憶體位置的實際值

System.out.printf("str1.equals(str2) ? %b\n", str1.equals(str2));
// output: str1.equals(str2) ? ? true

使用 == 比對變數記憶體位置是否相同,若利用String類別重寫Objecy物件中的equals方法,可以用來比對兩個「String」的值是否相等,詳讀原碼可以了解作法,是將String物件的value值拆解成char陣列實現字串值比對


上一篇
第三天 變數的使用方式
下一篇
第五日 基礎類型與引用類型
系列文
掌握Java神器,駕馭SpringBoot猛獸30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言